#include <iostream>
#include <vector>
#include <algorithm>    
using namespace std;
// 283. 移动零
// https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked-questions
// 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
// 请注意，必须在不复制数组的情况下对数组进行操作。
//
//
// 示例 1：
// 输入：nums = [0,1,0,3,12]
// 输出：[1,3,12,0,0]
// 解释：注意，输出数组不应为 [0,0,1,3,12]，而是返回 [1,3,12,0,0]。
// 示例 2：
// 输入：nums = [0]
// 输出：[0]




class Solution {
    public:
        void moveZeroes(vector<int>& nums) {
            int left=0;
            int right=0;
            for(int i=0;i<nums.size();i++)
            {
                if(nums[i]==0) right++;
                while(right<nums.size())
                {
                    while(right<nums.size()&&nums[right]==0) {right++;}
                    if(right>=nums.size()) return;
                    if(nums[right]!=0){
                        swap(nums[left],nums[right]);
                        left++;
                        right++;
                    }
                }
            }
        }
    };


    class Solution2 {
        public:
            void moveZeroes(vector<int>& nums) { 
                for(int dest=-1,cur=0;cur<nums.size();cur++){
                    if(nums[cur]!=0){
                        swap(nums[dest+1],nums[cur]);
                        dest++;
                    }
            
        
                }
        
            }
        };

        